/**
 * 
 */
package com.rhf.core.db.implementations.postgresql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.rhf.core.db.implementations.Base;
import com.rhf.core.db.interfaces.Classement;
import com.rhf.core.dto.ClassementVO;

/**
 * @author fabiensaulnier
 * 
 */
public class ClassementImp extends Base implements Classement {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Classement#contructeur(java.sql.ResultSet)
	 */
	public ClassementVO contructeur(ResultSet rs) throws Exception {

		ClassementVO classementVO = new ClassementVO();

		try {

			classementVO.setClassementId(rs.getInt("classement_id"));
			classementVO.setDateCreation(rs.getTimestamp("date_creation"));
			classementVO.setDateModification(rs.getTimestamp("date_modification"));
			classementVO.setAuteurId(rs.getInt("auteur_id"));
			classementVO.setCompetitionId(rs.getInt("competition_id"));
			classementVO.setEquipeId(rs.getInt("equipe_id"));
			classementVO.setNbJoue(rs.getInt("nb_joue"));
			classementVO.setPosition(rs.getInt("position"));
			classementVO.setVictoire(rs.getInt("victoire"));
			classementVO.setDefaite(rs.getInt("defaite"));
			classementVO.setNul(rs.getInt("nul"));
			classementVO.setForfait(rs.getInt("forfait"));
			classementVO.setPlus(rs.getInt("plus"));
			classementVO.setMoins(rs.getInt("moins"));
			classementVO.setForfaitCompetition(rs.getInt(rs.getInt("forfait_competition")));

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		}

		return classementVO;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Classement#ajouterClassement(com.rhf.core.db.valuesobjects.ClassementVO)
	 */
	public int ajouterClassement(ClassementVO classementVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "INSERT INTO classement ";
		query += "(date_creation, date_modification, auteur_id, competition_id, equipe_id, nb_joue, position, victoire, defaite, nul, forfait, plus, moins, forfait_competition) ";
		query += "VALUES (now(), now(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, classementVO.getAuteurId());
			stmt.setInt(i++, classementVO.getCompetitionId());
			stmt.setInt(i++, classementVO.getEquipeId());
			stmt.setInt(i++, classementVO.getNbJoue());
			stmt.setInt(i++, classementVO.getPosition());
			stmt.setInt(i++, classementVO.getVictoire());
			stmt.setInt(i++, classementVO.getDefaite());
			stmt.setInt(i++, classementVO.getNul());
			stmt.setInt(i++, classementVO.getForfait());
			stmt.setInt(i++, classementVO.getPlus());
			stmt.setInt(i++, classementVO.getMoins());
			stmt.setInt(i++, classementVO.getForfaitCompetition());

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Classement#modifierClassement(int, int)
	 */
	public int modifierClassement(ClassementVO classementVO) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "UPDATE classement ";
		query += "SET date_modification = now(), auteur_id = ?, nb_joue = ?, position = ?, victoire = ?, defaite = ?, nul = ?, forfait = ?, plus = ?, moins = ?, forfait_competition = ? ";
		query += "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?) ";
		query += "WHERE equipe_id = ? ";
		query += "AND competition_id = ?";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			int i = 1;
			stmt.setInt(i++, classementVO.getNbJoue());
			stmt.setInt(i++, classementVO.getPosition());
			stmt.setInt(i++, classementVO.getVictoire());
			stmt.setInt(i++, classementVO.getDefaite());
			stmt.setInt(i++, classementVO.getNul());
			stmt.setInt(i++, classementVO.getForfait());
			stmt.setInt(i++, classementVO.getPlus());
			stmt.setInt(i++, classementVO.getMoins());
			stmt.setInt(i++, classementVO.getEquipeId());
			stmt.setInt(i++, classementVO.getCompetitionId());

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Classement#recupererClassementParCompetition(int)
	 */
	public List<ClassementVO> recupererClassementParCompetition(int competitionId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		List<ClassementVO> list = null;

		// Requête SQL
		String query = "SELECT * FROM classement WHERE competition_id = ? ORDER BY position";

		try {

			// Connexion à la base de données
			conn = super.getConnection();
			stmt = conn.prepareStatement(query);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			rs = stmt.executeQuery();

			// Traitement des données
			if (rs.next()) {
				list = new ArrayList<ClassementVO>();
				list.add(this.contructeur(rs));
				while (rs.next()) {
					list.add(this.contructeur(rs));
				}
			}

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return list;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rhf.core.db.interfaces.Classement#supprimerClassement(int, int)
	 */
	public int supprimerClassement(int equipeId, int competitionId) throws Exception {

		Connection conn = null;
		PreparedStatement stmt = null;
		int nbLigneAffecte = 0;

		// Requête SQL
		String query = "DELETE FROM classement ";
		query += "WHERE equipe_id = ? ";
		query += "AND competition_id = ?";

		try {

			// Connexion à la base de données
			conn = getConnection();
			stmt = conn.prepareStatement(query);

			// Définition des paramètres (?)
			stmt.setInt(1, equipeId);
			stmt.setInt(2, competitionId);

			// Exécution de la requête
			this.appLog.debug(stmt.toString());
			nbLigneAffecte = stmt.executeUpdate();

		} catch (Exception e) {
			this.appLog.error(e.getMessage(), e);
			throw e;
		} finally {
			super.closeResources(null, stmt, conn);
		}

		return nbLigneAffecte;
	}

}
